8
תגובות

הוספה למערך במחלקה

פתח משהה ,
יש לי במחלקה, מערך private. הרעיון בו הוא לשמור שורות של פקודות SQL.
עכשיו, כשאני מנסה לעשות :
array_push($this->queryStored,$this->queryString);

במתודה כלשהיא, או אפילו במתודה נפרדת - זה לא עובד.
אבל בקונסטרקטור זה דווקא עובד מעולה (:
הקונסטרקטור שלי הוא כזה למקרה שזה משנה:

public function __construct(Database $__instance) {
        $this->queryString = '';
        $this->queryStored = array();
       // array_push($this->queryStored,3);
       // array_push( $this->queryStored , $this->queryString );
        $this->instance = $__instance;
    }


מה הבעיה? למה זה קורה?

8 תשובות

avatar ענה ldbrgr ב 15 ליולי 2013 #

יכול להיות הרבה דברים, בלי קוד אני לא חושב שמישהו יהיה מסוגל לעזור לך - תדביק פה את המחלקה ונראה מה הבעיה..

avatar ענה משהה ב 16 ליולי 2013 #

הנה המחלקה לביצוע שאילתות:

http://pastebin.com/B6mdqKU7

והזאת המחלקה הראשית של יצירת קשר עם הDB:

http://pastebin.com/a5VpTcWb

מקווה שזה יעזור(: תודה

avatar ענה ldbrgr ב 16 ליולי 2013 #

אין שום בעיה במחלקה, אבל אני לא רואה קריאה ל

SQLStatement::stored()
בשום מקום, אם אתה מנסה לגשת מחוץ לסקופ של המחלקה אין סיבה שזה יעבוד - המטודה פרטית..

avatar ענה משהה ב 16 ליולי 2013 #

עשיתי ניסוי כזה:

$db->prepareQuery()->select()->from('test')->stored();
$db->prepareQuery()->select()->from('moshe')->stored();
$db->prepareQuery()->select()->from('nagar')->stored();

$b = $db->prepareQuery()->getStored();

print_r($b);


שזה אומר - שלוש שורות שמכינות שאילתות - המתודה prepareQuery מחזירה מופע של SQLStatement - ושומרת אותם ע"י המתודה stored(שיניתי אותה לpublic, היא הייתה private כי ניסיתי לקרוא לה דרך from כדי לבדוק אולי יש בעיה בקריאה למתודה).
אחרי זה אני שומר במשתנה b את המערך שבו שמרתי את השאילתות ע"י stored(או יותר נכון, הייתי אמור).
ואז אני מדפיס את המערך .
התוצאה היא :
Array ( )

... זה מציג לי את המערך כמערך ריק ! למרות שהשתמשתי בstored.. =/

avatar ענה ldbrgr ב 17 ליולי 2013 #

*למחוק*

avatar ענה ldbrgr ב 17 ליולי 2013 #

..*למחוק*

avatar ענה ldbrgr ב 17 ליולי 2013 #

ברור שהמערך יהיה ריק, ב

Database::prepareQuery()

אתה מחזיר מופע חדש של המחלקה SQLStatement,
$queryStored שייך למופע ולא למחלקה, אם אתה רוצה שהוא יהיה שייך למחלקה תגדיר אותו כסטטי.

אם לא הבנת מה אני אומר תנסה את הקוד הזה:
$query1 = $db->prepareQuery();
 
  $query1->select()->from('test')->stored();
 
  $stored1 = $query1->getStored();
 
  var_dump($stored1); // prints array with 1 element
 
  $query2 = $db->prepareQuery();
 
  $stored2 = $query2->getStored();
 
  var_dump($stored); // prints empty array


כדי לשמור את השאילתות האחרונות את יכול לעשות שתי דברים:
להגדיר את המערך* $queryStored כסטטי או
להעביר את המערך* $queryStored למחלקה Database

לשתיהן יש חסרונות ויתרונות, אני הייתי הולך על האופציה השניה ובמקום לשמור את השאילתות כמחרוזות* הייתי שומר את המופעים של SQLStatement.

משהו כזה:
<?php
 
  class Database
  {
   
    protected $queryStored = array();
   
    public function prepareQuery()
    {
      $query = new SQLStatement($this);
     
      array_push($this->queryStored, $query);
     
      return $query;

      // *OR* just :
      return $this->queryStored[] = new SQLStatement($this);
    }
   
    // this function just for demonstration, i.e. you can get rid of it..
    public function getLastQuery()
    {
      return end($this->queryStored);
    }
   
    public function getQueryStored()
    {
      return $this->queryStored;
    }
  }


-------
מערך = array
מחרוזת = string

avatar ענה משהה ב 17 ליולי 2013 #

שיואו איך לא ראיתי את זהה !!! תודה רבה רבה אחי !
והאפשרות השניה לא תעזור לי, המטרה שלי היא בכלל לעשות union בין כל האיברים במערך, אז ככה ששמירה של המופעים לא תעזור, אבל המערך הסטטי כן תעזור, תודה !!!